package com.xiaoq.sites.repository.impl;
import com.xiaoq.sites.entity.InterpreterCalendarEntity;
import com.xiaoq.sites.repository.IInterpreterCalendarRepository;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.mongodb.morphia.Datastore;
import org.mongodb.morphia.query.Query;
import org.mongodb.morphia.query.UpdateOperations;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.List;

@Repository
public class InterpreterCalendarRepositoryImpl implements IInterpreterCalendarRepository {
	
	@Autowired
	private Datastore datastore;
	
	@Override
	public List<InterpreterCalendarEntity> findByInterpreterId(String interpreterId) {
		Query<InterpreterCalendarEntity> interpreterCalendarEntityQuery = datastore.find(InterpreterCalendarEntity.class);
		//TODO 排序？
		interpreterCalendarEntityQuery.field("interpreterId").equal(interpreterId);
		return interpreterCalendarEntityQuery.asList();
	}

	@Override
	public boolean save(InterpreterCalendarEntity interpreterCalendarEntity) {
		if(interpreterCalendarEntity != null){
			datastore.save(interpreterCalendarEntity);
			return true;
		}
		
		return false;
	}

	@Override
	public List<InterpreterCalendarEntity> findInterpreterCalendarBetweenTimes(String interpreterId, String sitesId, Long beginTime, Long endTime) {
		if(StringUtils.isAnyBlank(interpreterId, sitesId)){
			return new ArrayList<>();
		}
		Query<InterpreterCalendarEntity> interpreterCalendarQuery =
				datastore.find(InterpreterCalendarEntity.class)
				.field("interpreterId").equal(interpreterId)
				.field("sitesId").equal(sitesId)
				.field("status").notEqual(-4);

		if(beginTime != null && endTime != null){
			interpreterCalendarQuery.field("startTime").greaterThan(beginTime)
					.field("endTime").lessThan(endTime);
		}

		return interpreterCalendarQuery.asList();
	}

	@Override
	public List<InterpreterCalendarEntity> getInterCalendarListByOrderIds(List<String> orderIdList) {
		if(CollectionUtils.isEmpty(orderIdList)){
			return new ArrayList<>();
		}
		Query<InterpreterCalendarEntity> interpreterCalendarQuery =
				datastore.find(InterpreterCalendarEntity.class)
						.field("orderId").in(orderIdList);
		return interpreterCalendarQuery.asList();
	}

	@Override
	public InterpreterCalendarEntity getInterCalendarByOrderId(String orderId) {
		if(StringUtils.isBlank(orderId)){
			return null;
		}
		Query<InterpreterCalendarEntity> interpreterCalendarQuery =
				datastore.find(InterpreterCalendarEntity.class)
						.filter("orderId", orderId);
		return interpreterCalendarQuery.get();
	}

	@Override
	public long getInterWaitConfirmCountByUserId(String userId) {
		if(StringUtils.isBlank(userId)){
			return 0;
		}
		long count = datastore.find(InterpreterCalendarEntity.class)
				.field("userId").equal(userId)
				.field("status").equal(1)  //已支付,待确认
				.count();
		return count;
	}


	@Override
	public boolean updateInterCalendarByOrderId(InterpreterCalendarEntity interpreterCalendarEntity) {
		if(interpreterCalendarEntity==null || StringUtils.isBlank(interpreterCalendarEntity.getOrderId())){
			return false;
		}

		Query<InterpreterCalendarEntity> entityQuery = datastore.createQuery(InterpreterCalendarEntity.class)
				.filter("orderId", interpreterCalendarEntity.getOrderId());
		UpdateOperations<InterpreterCalendarEntity> ops = datastore.createUpdateOperations(InterpreterCalendarEntity.class);
		ops.set("updatedAt", System.currentTimeMillis());
		if(interpreterCalendarEntity.getContact() != null){
			ops.set("contact", interpreterCalendarEntity.getContact());
		}
		if(StringUtils.isNotBlank(interpreterCalendarEntity.getMemo())){
			ops.set("memo", interpreterCalendarEntity.getMemo());
		}
		if(StringUtils.isNotBlank(interpreterCalendarEntity.getMobile())){
			ops.set("mobile", interpreterCalendarEntity.getMobile());
		}
		if(interpreterCalendarEntity.getStatus() != null){
			ops.set("status", interpreterCalendarEntity.getStatus());
		}
		if(interpreterCalendarEntity.getStartTime() != null){
			ops.set("startTime", interpreterCalendarEntity.getStartTime());
		}
		if(interpreterCalendarEntity.getEndTime() != null){
			ops.set("endTime", interpreterCalendarEntity.getEndTime());
		}
		if(interpreterCalendarEntity.getType() != null){
			ops.set("type", interpreterCalendarEntity.getType());
		}
		if(interpreterCalendarEntity.getMeetPlace() != null){
			ops.set("meetPlace", interpreterCalendarEntity.getMeetPlace());
		}
		datastore.update(entityQuery, ops);
		return true;
	}

	@Override
	public boolean updateInterCalendarById(InterpreterCalendarEntity interpreterCalendarEntity) {
		if(interpreterCalendarEntity==null || StringUtils.isBlank(interpreterCalendarEntity.getId())){
			return false;
		}

		Query<InterpreterCalendarEntity> entityQuery = datastore.createQuery(InterpreterCalendarEntity.class)
				.filter("_id", interpreterCalendarEntity.getId());
		UpdateOperations<InterpreterCalendarEntity> ops = datastore.createUpdateOperations(InterpreterCalendarEntity.class);
		if(interpreterCalendarEntity.getContact() != null){
			ops.set("contact", interpreterCalendarEntity.getContact());
		}
		if(StringUtils.isNotBlank(interpreterCalendarEntity.getMemo())){
			ops.set("memo", interpreterCalendarEntity.getMemo());
		}
		if(StringUtils.isNotBlank(interpreterCalendarEntity.getMobile())){
			ops.set("mobile", interpreterCalendarEntity.getMobile());
		}
		if(interpreterCalendarEntity.getStatus() != null){
			ops.set("status", interpreterCalendarEntity.getStatus());
		}
		if(interpreterCalendarEntity.getUpdatedAt() != null){
			ops.set("updatedAt", interpreterCalendarEntity.getUpdatedAt());
		}
		if(interpreterCalendarEntity.getStartTime() != null){
			ops.set("startTime", interpreterCalendarEntity.getStartTime());
		}
		if(interpreterCalendarEntity.getEndTime() != null){
			ops.set("endTime", interpreterCalendarEntity.getEndTime());
		}
		if(interpreterCalendarEntity.getType() != null){
			ops.set("type", interpreterCalendarEntity.getType());
		}
		datastore.update(entityQuery, ops);
		return true;
	}
}
